/*
 * Personaje.h
 *
 *  Created on: 24/03/2013
 *      Author: Juliansci
 */

#ifndef PERSONAJE_H_
#define PERSONAJE_H_

#include "Entidad.h"
#include "util/CaminoMinimo.h"
#include "Casilla.h"
#include "Escenario.h"
#include <string>
#include "bonus/Bonus.h"
using namespace std;

class Casilla;
class Escenario;
class Personaje: public Entidad {
public:
	Personaje();
	virtual ~Personaje();
	void setVelocidad(int);
	int getVelocidad();
	void setAccion(string);
	string getAccion();
	void setCasillaInicial(int comienzoX , int comienzoY);
	void setCaminoInicial();
	void setdx(int);
	void setdXFinal(int);
	void setdy(int);
	void setdYFinal(int);
	void setX(int);
	void setY(int);
	int getdx();
	int getdXFinal();
	int getdy();
	int getdYFinal();
	void terminarCamino();
	void setDireccionMovimiento();
	string getDireccionMovimiento();
	string getDireccionMovimientoAnterior();
	void setDXDYFinales();
	void realizarMovimiento(Escenario*,Casilla*, Casilla*);
	bool mover();
	void avanzarAnimacion(int tiempoTranscurrido);
	void setUsuario(string usuario);
	string getUsuario();
	void armarAccion(string nombreAccion);
	string serialize();
	bool estaActivo();
	void setActivo(bool activo);
	void setEntidadAtacar(Entidad* p, Escenario* esc);
	bool estaCongelado();
	void setCongelado(bool congelado);
	void setPersonajeAtacar(Personaje* p);
	list<Casilla*>::iterator getIteradorCasillas();
	list<Casilla*> getCaminoMinimo();
	Entidad* oponenteTarget;
	Casilla* ultimaCasillaAtacar;
	bool cambiarCamino(Entidad* pActualizado, Escenario* es );
	void persigoOponente(Escenario* escenario);
	void atacar(int);
	void atacarServer(int);

	void setearValoresIniciales(Escenario* escenario);
	string getArmaSeleccionada();
	void setArmaSeleccionada(string armaSeleccionada);
	string obtenerMensajeAtacar();
	void setMagia(int magia);
	int getMagia();
	void setMagiaMaxima(int magia);
	int getMagiaMaxima();
	int getPasosVision();
	void setPasosVision(int pasos);
	list<Bonus*> getBonusDisponibles();
	void agregarBonusDisponible(Bonus* bonus);
	void agregarBonusDisponibles(list<Bonus*> bonus);
	Bonus* utilizarBonus(string tipoBonus);
	void setMensajeAtacar(string mensaje);
	int getBonusX();
	int getBonusY();
	void setBonusXY(int,int);

private:
	int velocidad, dx, dy, dxFinal, dyFinal, casillaComienzoX,casillaComienzoY, magia, magiaMaxima, pasosVision;
	string direccionMovimiento;
	string direccionMovimientoAnterior; //Ultima direccion de movimiento
	string usuario;
	string armaSeleccionada;
	list<Bonus*> listaBonusDisponibles;
	list<Casilla*> caminoMinimo;
	list<Casilla*>::iterator iteradorCasillas;
	bool activo;
	bool congelado;
	bool finAnimacionAtacar;
	string mensajeAtacar;
	string calcularDireccionAtaque(Casilla* origen, int xDest, int yDest);
	Ataque* ataqueDefault; //TODO: BORRAR
	bool compararCasillas(Casilla* origen, Casilla* destino);
	int bonusX, bonusY;

};

#endif /* PERSONAJE_H_ */
